package com.ewili.framework.utils;

import org.apache.commons.lang3.time.FastDateFormat;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

/**
 * 日期工具类
 *
 * @author leo
 */
public final class DateUtils extends org.apache.commons.lang3.time.DateUtils {


    //常用的日期格式pattern
    public static final String yyyyMMddHHmmss = "yyyyMMddHHmmss";
    public static final String yyyyMMdd = "yyyyMMdd";
    public static final String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss";
    public static final String yyyy_MM_dd = "yyyy-MM-dd";
    public static final String yy_MM_dd = "yy-MM-dd";
    public static final String yyyy_MM = "yyyy-MM";

    /**
     * 一分钟的秒数
     */
    public static final int SECOND_PER_MINUTE = 60;
    /**
     * 一小时的秒数
     */
    public static final int SECOND_PER_HOUR = SECOND_PER_MINUTE * 60;
    /**
     * 一天的秒数
     */
    public static final int SECOND_PER_DAY = SECOND_PER_HOUR * 24;


    /**
     * 格式化Calendar。
     *
     * @param calendar
     * @param pattern
     * @return
     */
    public static String format(Calendar calendar, String pattern) {
        FastDateFormat format = FastDateFormat.getInstance(pattern);// 优先从全局缓存中取，没有才会new
        return format.format(calendar);
    }

    /**
     * 格式化date。
     *
     * @param date
     * @param pattern
     * @return
     */
    public static String format(Date date, String pattern) {
        FastDateFormat format = FastDateFormat.getInstance(pattern);// 优先从全局缓存中取，没有才会new
        return format.format(date);
    }

    /**
     * 解析string为date。
     *
     * @param date
     * @param pattern
     * @return
     */
    public static Date parse(String date, String pattern) {
        FastDateFormat format = FastDateFormat.getInstance(pattern);
        try {
            return format.parse(date);
        } catch (ParseException e) {
            throw ExceptionUtils.propagate(e);
        }
    }

    /**
     * date 格式转换
     *
     * @param date
     * @param returnPattern
     * @return
     */
    public static Date parse(Date date, String returnPattern) {
        String dateStr = DateUtils.format(date, DateUtils.yyyy_MM_dd_HH_mm_ss);
        return DateUtils.parse(dateStr, returnPattern);
    }

    /**
     * 获取当前日期
     *
     * @return
     */
    public static Date currentDate(String returnPattern) {
        Date currentDate = new Date();
        return DateUtils.parse(currentDate, returnPattern);
    }

    /**
     * 判断date是否是今天
     *
     * @param date
     * @return
     */
    public static boolean isToday(Date date) {
        return isSameDay(new Date(), date);
    }

    /**
     * 计算before与当前日期相差的年份（now - before）
     *
     * @param before 之前的一个时间
     * @return
     */
    public static int getIntervalYears(Date before) {
        return getIntervalYears(new Date(), before);
    }

    /**
     * 计算两个日期相差的年份（after - before）
     *
     * @param after  之后的一个时间
     * @param before 之前的一个时间
     * @return
     */
    public static int getIntervalYears(Date after, Date before) {
        return getInterval(after, before, Calendar.YEAR);
    }

    /**
     * 得到当前星期字符串 格式（E）星期几
     */
    public static String getDayOfWeekToStr(Date... dates) {
        Date date = DateUtils.getDateFormDates(dates);
        return formatDate(date, "E");
    }

    /**
     * 得到当前星期Int
     */
    public static int getDayOfWeekToInt(Date... dates) {
        Date date = DateUtils.getDateFormDates(dates);
        Calendar calendar = Calendar.getInstance();
        if (date != null) {
            calendar.setTime(date);
        }
        int week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
        if (week < 0) {
            week = 0;
        }
        return week;
    }

    public static int getHourOfDayToInt(Date... dates) {
        Date date = DateUtils.getDateFormDates(dates);
        Calendar calendar = Calendar.getInstance();
        if (date != null) {
            calendar.setTime(date);
        }
        int hour = calendar.get(Calendar.HOUR_OF_DAY);
        return hour;
    }

    /**
     * 计算两个日期相差的天数 （after - before）
     *
     * @param after  之后的一个时间
     * @param before 之前的一个时间
     * @return
     */
    public static int getIntervalDays(Date after, Date before) {
        return getInterval(after, before, Calendar.DAY_OF_YEAR);
    }

    /**
     * 计算两个日期相差的秒数 （after - before）
     *
     * @param after  之后的一个时间
     * @param before 之前的一个时间
     * @return
     */
    public static long getIntervalSeconds(Date after, Date before) {
        return getIntervalMilliSeconds(after, before) / 1000;
    }

    /**
     * 计算两个日期相差的毫秒数（after - before）
     *
     * @param after  之后的一个时间
     * @param before 之前的一个时间
     * @return
     */
    public static long getIntervalMilliSeconds(Date after, Date before) {
        return after.getTime() - before.getTime();
    }

    /**
     * 比较前一个日期是否大于后一个日期
     *
     * @param dateOne
     * @param dateTwo
     * @return
     */
    public static boolean compareTwoDate(Date dateOne, Date dateTwo) {
        int truncatedEquals = DateUtils.truncatedCompareTo(dateOne,
                dateTwo, Calendar.DATE);
        return truncatedEquals > 0;
    }

    /**
     * 计算两个日期的差（after - before）
     *
     * @param after  之后的一个时间
     * @param before 之前的一个时间
     * @param field  对比的时间单位，如Calendar.YEAR，见{@link Calendar}
     * @return
     */
    private static int getInterval(Date after, Date before, int field) {
        return getInterval(toCalendar(after), toCalendar(before), field);
    }

    public static boolean isWeekend(Date... dates) {
        Date date = DateUtils.getDateFormDates(dates);
        int week = DateUtils.getDayOfWeekToInt(date);
        int hour = DateUtils.getHourOfDayToInt(date);
        return (week == 6 && hour >= 5) || week == 0 || (week == 1 && hour < 5);
    }

    /**
     * 计算两个日期的差 （after - before）
     *
     * @param after  之后的一个时间
     * @param before 之前的一个时间
     * @param field  对比的时间单位，如Calendar.YEAR，见{@link Calendar}
     * @return
     */
    private static int getInterval(Calendar after, Calendar before, int field) {
        return after.get(field) - before.get(field);
    }

    /**
     * 得到日期字符串 默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
     */
    public static String formatDate(Date date, Object... pattern) {
        String formatDate = null;
        if (pattern != null && pattern.length > 0) {
            formatDate = DateUtils.format(date, pattern[0].toString());
        } else {
            formatDate = DateUtils.format(date, "yyyy-MM-dd");
        }
        return formatDate;
    }

    private static Date getDateFormDates(Date... dates) {
        Date date = null;
        if (dates != null && dates.length > 0) {
            date = dates[0];
        } else {
            date = new Date();
        }
        return date;
    }


}
